/**
 * 
 */
package com.rhf.ui.admin.actions.general;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.rhf.core.commons.Utils;
import com.rhf.core.commons.logging.AppLog;
import com.rhf.core.commons.logging.AppLogManager;
import com.rhf.core.dto.UtilisateurVO;
import com.rhf.core.services.UtilisateurServices;
import com.rhf.ui.admin.session.UserSession;
import com.rhf.ui.admin.session.UserSessionKey;

/**
 * Action pour se connecter à la partie administration
 * 
 * @author fabiensaulnier
 * 
 */
public class LoginAction extends Action {

	/**
	 * s Login saisi par l'utilisateur
	 */
	private String login;

	/**
	 * Mot de passe saisi par l'utilisateur
	 */
	private String motDePasse;

	/**
	 * Objet décrivant un utilisateur
	 */
	private UtilisateurVO utilisateurVO;

	/**
	 * Logger
	 */
	private AppLog appLog = AppLogManager.getUiLogger();

	/*
	 * (non-Javadoc)
	 * 
	 * @seeorg.apache.struts.action.Action#execute(org.apache.struts.action. ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

		appLog.debug("Debut de l'action [Se connecter]");

		ActionForward actionForward = null;

		try {

			// Récupération des informations depuis l'interface
			this.login = Utils.stringValue(request.getParameter("login"));
			this.motDePasse = Utils.stringValue(request.getParameter("motDePasse"));

			// Objet UtilisateurVO
			this.utilisateurVO = new UtilisateurVO();
			this.utilisateurVO.setLogin(this.login);
			this.utilisateurVO.setMotDePasse(this.motDePasse);

			// Vérifier si l'utilisateur existe
			if (UtilisateurServices.verifierExistenceUtilisateur(utilisateurVO)) {

				this.appLog.debug("L'utilisateur [" + this.login + "] existe bien avec le bon mot de passe renseigne");
				// Mettre OK en session
				this.initSession(request);

				// Redirection / Mapping
				actionForward = mapping.findForward("success");

			} else {

				// Redirection
				actionForward = mapping.findForward("strong");

				// TODO
				// Affichage du message d'erreur
				throw new Exception("Le couple Nom d'utilisateur / Mot de passe saisi n'est pas valide");

			}

		} catch (Exception e) {
			actionForward = mapping.findForward("error");
			appLog.error("Une erreur est survenue lors de l'identification", e);
			throw new Exception("Une erreur est survenue lors de l'identification", e);
		}

		appLog.debug("Fin de l'action [Se connecter]");

		// Redirection
		String path = actionForward.getPath();
		ActionForward newActionForward = new ActionForward(actionForward);
		newActionForward.setPath(path);
		return newActionForward;
	}

	/**
	 * Initialise la session utilisateur
	 * 
	 * @param request
	 * @throws Exception
	 */
	private void initSession(HttpServletRequest request) throws Exception {

		// On récupère l'objet session déjà existant sinon on instancie un
		// nouveau
		UserSession userSession = (UserSession) request.getSession().getAttribute(UserSessionKey.USER_SESSION);
		if (userSession == null) {
			userSession = new UserSession();
		}

		this.utilisateurVO = UtilisateurServices.recupererUtilisateur(login, motDePasse);

		// Mise à jour de l'objet userSession
		userSession.setLogin(this.utilisateurVO.getLogin());
		userSession.setNomUilisateur(this.utilisateurVO.getNom());
		userSession.setPrenomUtilisateur(this.utilisateurVO.getPrenom());
		userSession.setUtilsateurId(this.utilisateurVO.getUtilisateurId());

		// Initialisation de la session
		request.getSession().setAttribute(UserSessionKey.USER_SESSION, userSession);
		this.appLog.debug("Initialisation de la session de l'utilisateur [" + this.utilisateurVO.getLogin() + "]");

	}
}
